﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MyFinanceManager.Objects;
using System.IO;

namespace MyFinanceManager.PC.Converter
{
    public partial class MainWindow : Form
    {
        #region Erklärung StarMoney-Format
        /*
                   0 = Saldo          386,34
                   1 = Betrag         386,34
                   2 = Buchungstag    02.02.2009
                   3 = Beschreibung   asdfjköl
                   4 = Text           asdfjköl
                   5 = Text           asdfjköl
                   6 = Text           Kategorie
                   7 = Text           Unterkategorie
                   8 = LineBreak
                   
                   "Saldo";"SdoWaehr";"AgBlz";"AgKto";"AgName1";"Storno";"OrigBtg";"Betrag";"BtgWaehr";"OCMTBetr";"OCMTWaehr";"Textschl";"VWZ1";"VWZ2";"VWZ3";"VWZ4";"VWZ5";"VWZ6";"VWZ7";"VWZ8";"VWZ9";"VWZ10";"VWZ11";"VWZ12";"VWZ13";"VWZ14";"BuchDatum";"WertDatum";"Primanota";"Kategorie";"Unterkat";"Kostenst";"BuchText"
                   250,00;"EUR";"";"";"";0;250,00;250,00;"EUR";250,00;"EUR";0;"StarMoney autom. Ausgleich";"Fehlende Online-Umsätze";"";"";"";"";"";"";"";"";"";"";"";"";10.11.2008;10.11.2008;"";"Fahrzeuge";"Benzin/Öl";"Privat";""
                   148,34;"EUR";"20040000";"620496001";"SB-TANK. 0047, NUERNBERG";0;-51,66;-51,66;"EUR";-51,66;"EUR";5;"EC 85543027 10.11 07.50 CE0";"02        0812 050331 EUR01";"6726737308000813114 2800408";"";"";"";"";"";"";"";"";"";"";"";12.11.2008;12.11.2008;"931";"";"";"";"LASTSCHRIFT"
                   {0};"EUR";"";"";"";0;{1};{1};"EUR";{1};"EUR";0;"{3}";"{4}";"{5}";"";"";"";"";"";"";"";"";"";"";"";{2};{2};"";"";"";"";""
                   */
        #endregion
        private const string StarMoneyHeader = "\"Saldo\";\"SdoWaehr\";\"AgBlz\";\"AgKto\";\"AgName1\";\"Storno\";\"OrigBtg\";\"Betrag\";\"BtgWaehr\";\"OCMTBetr\";\"OCMTWaehr\";\"Textschl\";\"VWZ1\";\"VWZ2\";\"VWZ3\";\"VWZ4\";\"VWZ5\";\"VWZ6\";\"VWZ7\";\"VWZ8\";\"VWZ9\";\"VWZ10\";\"VWZ11\";\"VWZ12\";\"VWZ13\";\"VWZ14\";\"BuchDatum\";\"WertDatum\";\"Primanota\";\"Kategorie\";\"Unterkat\";\"Kostenst\";\"BuchText\"";
        private const string StarMoneyFormat = "{8}{0};\"EUR\";\"\";\"\";\"\";0;{1};{1};\"EUR\";{1};\"EUR\";0;\"{3}\";\"{4}\";\"{5}\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";{2};{2};\"\";\"{6}\";\"{7}\";\"\";\"\"";

        #region Erklärung MeinGeld-Format
        /* 
                   0 = Buchungstag     02.02.2009
                   1 = Betrag          386,34
                   2 = Empfänger       asdfjköl
                   3 = Buchungsbetreff asdfjköl
                   4 = Beschreibung    Benzin für Fahrt nach Regensburg
                   5 = Kategorie       Auto:Benzin
                   6 = ^
                   7 = LineBreak
           
                   !Type:Cash
                   D14.01.2009
                   T13,00
                   PKeine Angabe
                   NKeine Angabe
                   Mführungszeugnis
                   LKeine Angabe
                   ^
                   D10.11.2008
                   T250,00
                   PKeine Angabe
                   NKeine Angabe
                   MStarMoney autom. AusgleichFehlende Online-Umsätze
                   LAusgaben:Sonstige Ausgaben
                   ^
                   */
        #endregion
        private const string MeinGeldHeader = "!Type:Cash";
        private const string MeinGeldFormat = "{7}D{0}{7}T{1}{7}P{2}{7}N{3}{7}M{4}{7}L{5}{7}{6}{7}";


        public MainWindow()
        {
            InitializeComponent();
            this.dtpFrom.Value = new DateTime(2009, 1, 1);
            this.cbAccounts.Items.AddRange(Database.NamesOfAccounts.ToArray());
        }

        private void btSelect_Click(object sender, EventArgs e)
        {
            this.openFileDialog.Filter = "MFM-Database (*.xml)|*.xml";
            if (this.openFileDialog.ShowDialog() == DialogResult.OK)
            {
                this.tbFileName.Text = this.openFileDialog.FileName;
            }
        }

        private void tbFileName_TextChanged(object sender, EventArgs e)
        {
            ValidateButtonStart();
        }

        private void ValidateButtonStart()
        {
            this.btStart.Enabled = !String.IsNullOrEmpty(this.tbFileName.Text) && System.IO.File.Exists(this.tbFileName.Text) && ((this.cbStarMoney.Checked || this.cbMeinGeld.Checked));
        }

        private void btStart_Click(object sender, EventArgs e)
        {
            this.richTextBox1.Text = "";

            AppendToTextbox("Initialisiere Datenbank");
            Database.Init(this.tbFileName.Text);

            AppendToTextbox("Konvertierung abgeschlossen");

            if (this.cbStarMoney.Checked)
            {
                AppendToTextbox("Exportiere für Starmoney");
                List<string> stringsForStarMoney = ExportExpensesAndEarningsStarmoney();
                SaveCollection(stringsForStarMoney, this.tbStarmoney.Text);
            }
            if (this.cbMeinGeld.Checked)
            {
                AppendToTextbox("Exportiere für Mein Geld");
                List<string> stringsForMeinGeld = ExportExpensesAndEarningsMeingeld();
                SaveCollection(stringsForMeinGeld, this.tbMeinGeld.Text);
            }

            foreach (var item in Database.Db.Fuels)
            {
                TankquittungViewer tqv = new TankquittungViewer(item);
                tqv.ShowDialog();
            }
        }

        private List<string> ExportExpensesAndEarningsMeingeld()
        {
            List<string> content = new List<string>();
            content.Add(MeinGeldHeader);

            foreach (var item in Database.Db.Expenses)
            {
                int faktor = -1;
                if (CheckIfItemIsValid(item))
                {
                    string contentMeinGeld = String.Format(MeinGeldFormat, item.Time.ToShortDateString(), item.Amount * faktor, "", "", item.Description, item.CategoryName, "^", Environment.NewLine);
                    content.Add(contentMeinGeld);
                    AppendToTextbox(item);
                }
            }
            foreach (var item in Database.Db.Earnings)
            {
                int faktor = 1;
                if (CheckIfItemIsValid(item))
                {
                    string contentMeinGeld = String.Format(MeinGeldFormat, item.Time.ToShortDateString(), item.Amount * faktor, "", "", item.Description, item.CategoryName, "^", Environment.NewLine);
                    content.Add(contentMeinGeld);
                    AppendToTextbox(item);
                }
            }
            return content;
        }

        private bool CheckIfItemIsValid(PostingRecord item)
        {
            return item.Time.Date >= this.dtpFrom.Value.Date && (String.IsNullOrEmpty(this.cbAccounts.Text) || item.AccountName.Equals(this.cbAccounts.Text, StringComparison.InvariantCultureIgnoreCase));
        }

        private List<string> ExportExpensesAndEarningsStarmoney()
        {
            double saldo = 0;
            List<string> content = new List<string>();
            content.Add(StarMoneyHeader);

            foreach (var item in Database.Db.Expenses)
            {
                int faktor = -1;
                if (CheckIfItemIsValid(item))
                {
                    saldo -= item.Amount;

                    string contentStarMoney = String.Format(StarMoneyFormat, saldo, item.Amount * faktor, item.Time, item.Description, "", "", item.CategoryName, item.SubCategoryName, Environment.NewLine);
                    content.Add(contentStarMoney);

                    AppendToTextbox(item);
                }
            }
            foreach (var item in Database.Db.Earnings)
            {
                if (CheckIfItemIsValid(item))
                {
                    saldo += item.Amount;

                    string contentStarMoney = String.Format(StarMoneyFormat, saldo, item.Amount, item.Time, item.Description, "", "", item.CategoryName, item.SubCategoryName, Environment.NewLine);
                    content.Add(contentStarMoney);

                    AppendToTextbox(item);
                }
            }
            return content;
        }

        private void SaveCollection(List<string> strings, string filename)
        {
            if (File.Exists(filename))
            {
                File.Delete(filename);
            }
            foreach (var item in strings)
            {
                File.AppendAllText(filename, item, Encoding.Default);
            }
            AppendToTextbox("Einträge in " + filename + " gespeichert.");
        }

        private void AppendToTextbox(PostingRecord item)
        {
            AppendToTextbox(String.Format("      Eintrag im Wert von '{0}€' aus Kategorie '{1}' konvertiert.", item.Amount, item.CategoryName));
        }

        private void AppendToTextbox(string p)
        {
            if (string.IsNullOrEmpty(this.richTextBox1.Text))
                this.richTextBox1.Text = DateTime.Now.ToLongTimeString() + " " + p;
            else
                this.richTextBox1.Text = this.richTextBox1.Text + Environment.NewLine + DateTime.Now.ToLongTimeString() + " " + p;
        }

        private void cbMeinGeld_CheckedChanged(object sender, EventArgs e)
        {
            this.tbMeinGeld.Enabled = this.cbMeinGeld.Checked;
            if (this.tbMeinGeld.Enabled)
            {
                this.saveFileDialog.Filter = "MeinGeld-Export (*.qif)|*.qif";
                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                    this.tbMeinGeld.Text = this.saveFileDialog.FileName;
            }
            ValidateButtonStart();
        }

        private void cbStarMoney_CheckedChanged(object sender, EventArgs e)
        {
            this.tbStarmoney.Enabled = this.cbStarMoney.Checked;
            if (this.tbStarmoney.Enabled)
            {
                this.saveFileDialog.Filter = "Starmoney-Export (*.csv)|*.csv";
                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                    this.tbStarmoney.Text = this.saveFileDialog.FileName;
            }
            ValidateButtonStart();
        }

        private void btExit_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }
    }
}
